home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 9 / Night Owl CD-ROM (NOPV9) (Night Owl Publisher) (1993).ISO / 004a / pbc22a.zip / PBCLONE.DOC < prev    next >
Text File  |  1993-04-26  |  54KB  |  1,160 lines

  1.                      The PBClone Library
  2.                    =---------------------=
  3.                          Version 2.2
  4.  
  5.     PBCLONE  Copyright (c) 1990-1993  Thomas G. Hanlin III
  6.  
  7.  
  8.  
  9. Use of LIBMAT or LIBWIZ is strongly recommended for creating
  10. the initial PBClone library.  You should be able to get these
  11. utilities from the same place you got this library.
  12.  
  13. This is PBClone, a library of over 610 assembly language and
  14. BASIC routines for use with Microsoft's BASIC compilers:
  15. Bascom, PDS, QuickBasic and Visual BASIC for DOS.  The PBClone
  16. collection is copyrighted and may be distributed only under the
  17. following conditions:
  18.  
  19.    All PBClone files must be distributed together as a unit.
  20.    No files may be altered, added, or deleted from this unit.
  21.    Assembly language source code may not be distributed.
  22.  
  23. YOU USE THIS LIBRARY AT YOUR OWN RISK.  I have tested it on my
  24. own computer, but I will not assume any responsibility for any
  25. problems which PBClone may cause you.  If you do run into a
  26. problem, please let me know about it, and I will do my best to
  27. verify and repair it.
  28.  
  29. It is expected that if you find PBClone useful, you will
  30. register your copy.  You may not use PBClone routines in
  31. programs intended for sale unless you have registered.
  32.  
  33. Registration gets you the latest version of PBClone, complete
  34. with full source code.  The assembly language code is designed
  35. for MASM 6.0 and may require alteration for other assemblers.
  36.  
  37. You will need to have a complete set of PBClone .OBJ files for
  38. LibWiz to work.  Create a fresh subdirectory and extract the
  39. BASIC sources from PBC$BAS.ZIP (or .LZH, etc).  Compile them
  40. all.  The following DOS command will do it:
  41.  
  42.    FOR %x IN (*.BAS) DO BC %x /o;
  43.  
  44. Now extract the .OBJ files from PBC$MAIN.LIB into the same
  45. directory, using the UnLib utility that comes with LibWiz.
  46. Finally, extract the .OBJ files from PBC$NEAR.LIB as well. This
  47. gives you a complete set of .OBJs for PBClone, allowing LibWiz
  48. to create a custom PBClone library for you.
  49.  
  50. The VB-DOS compiler always uses far strings.  For it, you must
  51. use the .OBJs from PBC$FAR.LIB instead of PBC$NEAR.LIB.
  52.  
  53. With PDS, you have a choice between near and far strings.  To
  54. use far strings, use the /FS switch when compiling, and use the
  55. .OBJs from PBC$FAR.LIB instead of PBC$NEAR.LIB.
  56.  
  57.                      Creating .QLB files
  58.  
  59.  
  60.  
  61. If you like to use the BASIC editor/environment, you will need
  62. to create a .QLB version of the library to complement the .LIB
  63. version.  LIBWIZ can do it for you, or you can do it manually.
  64. This is done using the LINK.EXE utility that came with your
  65. compiler.  The exact parameters differ slightly depending on
  66. which version of the compiler you have.  For QuickBasic, it
  67. looks something like this:
  68.  
  69.    LINK libname.LIB/Q/SE:1024,libname.QLB,NUL,BQLB45;
  70.  
  71. The BQLB45 file is for QuickBasic 4.5.  This should be replaced
  72. by BQLB40 or BQLB41 for QuickBasic 4.0 (check your files to see
  73. which you have).  For BASCOM 6.0-7.1, also called Professional
  74. Development System or PDS, use QBXQLB instead of BQLB45.  For
  75. VB-DOS, use VBDOSQLB instead of BQLB45.
  76.  
  77. Since you'll probably want to do this again in the future when
  78. you get a new version of BasWiz or PBClone, I'd suggest you
  79. create a batch file or alias to do the work for you.  If you
  80. have 4DOS, an alias such as the following will do it:
  81.  
  82.    ALIAS QLB LINK %%1.LIB/Q/SE:1024,%%1.QLB,NUL,BQLB45;
  83.  
  84. In this case, you can do the conversion simply by typing:
  85.  
  86.    QLB libname
  87.  
  88.                      The TSR File Viewer
  89.  
  90.  
  91.  
  92. Since there are hundreds of routines in PBClone, it isn't
  93. always exactly easy to remember which routine you want or how
  94. to use it.  This is a particular problem when you're in the
  95. middle of writing a program.  So, I've written a TSR file
  96. viewer... it's crude, but it gets the job done.
  97.  
  98. Just type "FV" to install the TSR.  Alt-V activates it.  "FV
  99. /D" removes it from memory.
  100.  
  101.      !!! ----== NOTE ==---- !!!
  102. Please check FV with a nonessential application first!  It
  103. appears to work fine in the QuickBasic environment, but it
  104. locks up my favorite editor, so I can't guarantee that it will
  105. behave properly in all circumstances.
  106.  
  107. First, FV will ask you for the file to view.  This may contain
  108. drive and subdirectory information as well as the file name.
  109. Second, you will be asked for a search string.  If you enter a
  110. search string, viewing will start at the part of the file that
  111. contains that search string.  If you just press enter, viewing
  112. will start at the beginning of the file.  The file will be
  113. presented to you one page at a time.  I suggest viewing
  114. PBCLONE.DOC or PBCLONE.INF.
  115.  
  116. FV was written in BASIC using Crescent's P.D.Q. library, with
  117. the "simplified" TSR handler (which doesn't seem to have been
  118. entirely debugged).  Then again, TSRs are a tricky matter,
  119. especially with BASIC...
  120.  
  121.                         General Notes
  122.  
  123.  
  124.  
  125. The initial version of PBClone had only one manual.  However,
  126. since there are so many routines, I've split the manual into a
  127. general documentation file and a reference manual.  You won't
  128. want to print PBCLONE.MAN unless you have a lot of time and
  129. printer paper!  In contrast, this file (PBCLONE.DOC) has been
  130. kept small to allow ready printing.  It contains general notes,
  131. cross-reference listings of the routines, and assorted charts.
  132.  
  133. Many of the routines in PBClone are similar to routines of the
  134. same name in ADVBAS and/or ProBas.  The key here is "similar"--
  135. they don't necessarily work the same way and may not produce
  136. the same results.  If you intend to convert from ADVBAS or
  137. ProBas to PBClone, read the documentation carefully.
  138.  
  139. When a PBClone returns a Boolean (on or off) value, it will
  140. always be 0 if off, -1 if on; this is unlike ProBas, which
  141. would often return any non-zero value for an "on" state.
  142. Booleans passed to PBClone may still use any non-zero value to
  143. indicate a "true" or "on" condition, however.
  144.  
  145. Critical error handling has been incorporated into all disk and
  146. device routines.  You will never have to worry about "R>etry,
  147. A>bort, I>gnore" again, so long as you use PBClone for your
  148. disk and device management.
  149.  
  150. PBClone file handling is very flexible but may be confusing to
  151. people used to BASIC's strongly-moded files.  PBClone file
  152. handling is most similar to BASIC files opened in BINARY mode.
  153. You may read or write any amount of information at a time.
  154. After each read or write takes place, the file pointer is
  155. updated appropriately, so you can use sequential access
  156. techniques without further effort.  Random access is also
  157. possible, using FSetLoc/FSetOfs/FSetRec to set the file pointer
  158. position.  Those of you who are familiar with C or Pascal file
  159. handling will notice strong similarities in this approach,
  160. which is based on techniques that have long been standard in
  161. the industry.
  162.  
  163. Many routines are available both as SUBprograms and as
  164. FUNCTIONs.  The former is for compatibility with older programs
  165. which were designed before BASIC was capable of using
  166. FUNCTIONs.  You may use either, of course, although the
  167. FUNCTION version of a routine is often more convenient.
  168.  
  169.                         General Notes
  170.  
  171.  
  172.  
  173. The PBClone library can be used in conjunction with other
  174. libraries.  If there is a conflict in routine names between the
  175. two libraries, the OBJTOOL utility can be used to rename one or
  176. the other routine.  Due to the large size of PBClone, you will
  177. probably need to select just the routines you need, rather than
  178. combining the entire libraries, in order to avoid overflowing
  179. LINK limitations.  OBJTOOL can help you find out which routines
  180. are in what modules.  The LIB utility can be used to alter
  181. existing libraries, or you can build your own custom libraries
  182. from the ground up, using LibWiz.  See the LIB_BI.DOC and
  183. LIBRARY.TXT files if you are not familiar with libraries.
  184.  
  185. LibMatic, LibWiz and ObjTool are included on the sampler disk
  186. that comes with the registered version of PBClone.  They should
  187. also be available at your local BBS.
  188.  
  189. If you have not used ADVBAS, ProBas, or PBClone before, you may
  190. be unfamiliar with the array handling conventions used here.
  191. In almost all array routines, you will see a pair of parameters
  192. (e.g. DSeg% and DOfs%) used to represent an array.  These
  193. values are obtained by the BASIC functions VARSEG and VARPTR:
  194.  
  195.    DSeg% = VARSEG(Array(1))    ' or whatever the first...
  196.    DOfs% = VARPTR(Array(1))    ' ...desired element may be
  197.  
  198. This is the way that current versions of QuickBasic and BASCOM
  199. pass arrays, TYPEd values, and fixed-length STRING values to
  200. assembly-language routines.  It tells the routine where in
  201. memory to find the value(s).  Since these values may move
  202. around in memory, it is important to get the VARSEG and VARPTR
  203. just before you call the routine.  Any routine that accepts a
  204. segment and an offset can be used with arrays, TYPEd values,
  205. and fixed-length strings interchangeably.  This allows for
  206. considerable flexibility.
  207.  
  208. Virtually all of the variables used in PBClone are integers.
  209. In this manual, integers are indicated specifically by use of
  210. the "%" integer postfix.  The use of DEFINT A-Z in your program
  211. will cause your variables to be integers by default, which I
  212. would recommend unless you use floating point heavily.
  213.  
  214.                         General Notes
  215.  
  216.  
  217.  
  218. Most of the routines in ProBas (and all of the routines in
  219. ADVBAS) did not require a DECLARE if the CALL syntax was used.
  220. This is not true of PBClone, which requires DECLAREs.  There
  221. are numerous advantages to this:
  222.  
  223.    1) BASIC can more easily detect syntax errors.
  224.    2) You may use CALL or the new simplified syntax.
  225.    3) Many of the routines are smaller and faster due to
  226.       use of the DECLARE option BYVAL.
  227.  
  228. The DECLAREs are generated in a .BI file by LIBWIZ.  Assuming
  229. you named the library PBC, you can include the DECLAREs in your
  230. program with this statement:
  231.  
  232.    REM $INCLUDE: 'PBC.BI'
  233.  
  234. The PBC.BI file must be in the same directory as your program,
  235. or you can put it into a specific directory by setting an
  236. environment variable.  I keep my include files in a directory
  237. called C:\INCLUDE, so I have the following line in my
  238. AUTOEXEC.BAT:
  239.  
  240.    SET INCLUDE=C:\INCLUDE
  241.  
  242. As mentioned, there are now two ways of calling any
  243. subprogram.  You can use the CALL keyword or an implicit call.
  244. In the case of the CopyFile routine, for instance, you could
  245. use either of these calls interchangeably:
  246.  
  247.    CALL CopyFile (FromFile$, ToFile$, ErrCode%)
  248.  
  249.    CopyFile FromFile$, ToFile$, ErrCode%
  250.  
  251. The latter technique is more elegant, to my tastes, and is the
  252. one used throughout the PBClone documentation and examples.
  253. You may use whichever method you prefer-- BASIC generates the
  254. same code either way.
  255.  
  256. How you capitalize the names of the variables and routines is
  257. up to you.  I like mixed uppercase and lowercase, but it really
  258. doesn't matter.  You can also change the names of the variables
  259. or even replace them with constants, as long as you maintain
  260. the correct type:
  261.  
  262.    COPYfile "C:\AUTOEXEC.BAT", "A:AUTOEXEC.BAT", errornumber%
  263.  
  264.                         General Notes
  265.  
  266.  
  267.  
  268. If you have registered PBClone and wish to reassemble all of the
  269. routines written in assembly language, first place these
  270. routines in their own subdirectory.  Then:
  271.  
  272.    FOR %x IN (*.ASM) DO MASM %x ;
  273.  
  274. Note that you will need to use "%%x" instead of "%x" if you
  275. place this statement in a batch file.
  276.  
  277. The .OBJ files created by this process will be compatible with
  278. QuickBasic strings and PDS near strings.  If you have PDS and
  279. would like to create a far string version of PBClone, you must
  280. set the FarString label when assembling.  Far strings are also
  281. required for the VB-DOS compiler.
  282.  
  283.    FOR %x IN (*.ASM) DO MASM %x /DFarString ;
  284.  
  285. You can most readily create a library from the resulting .OBJ
  286. files by using the LibMatic or LibWiz utilities.  Due to the
  287. size of PBClone, manual library creation is not recommended.
  288.  
  289. If you find any bugs or problems with PBClone, or have any
  290. suggestions to make, please let me know.  You can reach me
  291. through any of the BBSes listed in WHERE.BBS, or write to me by
  292. conventional mail.  Please DO NOT call me directly!  I loathe a
  293. ringing phone.  Phones were meant for modem use only!
  294.  
  295.                       Routine Reference
  296.  
  297.  
  298.  
  299. Array Management:
  300.    AddMatI       add to each element of an integer array
  301.    AddMatL       add to each element of a long integer array
  302.    BinSeekD      search a sorted array of double-precision nos.
  303.    BinSeekI      search a sorted array of integers
  304.    BinSeekL      search a sorted array of long integers
  305.    BinSeekS      search a sorted array of single-precision nos.
  306.    BinSeekSt     search a sorted array of strings
  307.    DRecDel       delete a record or element from an array
  308.    DRecIns       insert a record or element into an array
  309.    InitPtr       initialize an array of pointers
  310.    MatShuffleD   shuffle an array of double-prec numbers
  311.    MatShuffleI   shuffle an array of integers
  312.    MatShuffleL   shuffle an array of long integers
  313.    MatShuffleS   shuffle an array of single-prec numbers
  314.    MatShuffleSt  shuffle an array of strings
  315.    MeanAverageD  calculate the average of a double-prec. array
  316.    MeanAverageI  calculate the average of an integer array
  317.    MeanAverageL  calculate the average of a long integer array
  318.    MeanAverageS  calculate the average of a single-prec. array
  319.    MulMatI       multiply each element of an integer array
  320.    PSortD        pointer-sort a double-prec. array
  321.    PSortI        pointer-sort an integer array
  322.    PSortL        pointer-sort a long integer array
  323.    PSortS        pointer-sort a single-prec. array
  324.    PSortSt       pointer-sort a string array
  325.    ReverseD      reverse the elements in a double-prec. array
  326.    ReverseI      reverse the elements in an integer array
  327.    ReverseL      reverse the elements in a long integer array
  328.    ReverseS      reverse the elements in a single-prec. array
  329.    ReverseSt     reverse the elements in a string array
  330.    SetMatD       set each element of a double-precision array
  331.    SetMatI       set each element of an integer array
  332.    SetMatL       set each element of a long integer array
  333.    SetMatS       set each element of a single-precision array
  334.    SortD         sort an array of double-precision numbers
  335.    SortI         sort an array of integers
  336.    SortL         sort an array of long integers
  337.    SortS         sort an array of single-precision numbers
  338.    SortSt        sort an array of strings
  339.  
  340.                       Routine Reference
  341.  
  342.  
  343.  
  344. Disk:
  345.    BootDrive$    determine the drive used to boot the computer
  346.    CDROM         see if a CD-ROM is installed and get info
  347.    CheckDisk     see if a disk is ready to be accessed
  348.    CheckDsk%     see if a disk is ready to be accessed
  349.    CheckShare    determine whether SHARE is installed
  350.    CheckShare2%  determine whether SHARE is installed
  351.    Cylinders%    get number of cylinders for a given drive
  352.    DblSpace%     determine whether DBLSPACE is installed
  353.    DelSub        delete a subdirectory
  354.    DiskStat      get information on disk memory
  355.    DReadAbs      read absolute disk sector (drive <32M)
  356.    DReadAbsBig   read absolute disk sector (any size drive)
  357.    DriveSpace&   see how much space is free on a disk
  358.    DrvType       see if a drive is removeable and/or networked
  359.    DWriteAbs     write absolute disk sector (drive <32M)
  360.    DWriteAbsBig  write absolute disk sector (any size drive)
  361.    FDescRead$    read a 4DOS-style file description
  362.    FindFirstF    find the first file to match specs
  363.    FindFirstFx   find the first file to match specs
  364.    FindNextF     find any other files which match specs
  365.    FindNextFx    find any other files which match specs
  366.    Floppies      see how many floppy drives are attached
  367.    Floppies2%    see how many floppy drives are attached
  368.    FloppyType    see what types of floppy drives are installed
  369.    FReadLine     read a line of text from a file (LINE INPUT#)
  370.    GetAttrF      get attribute of a file matched by FindFirstF
  371.    GetAttrFx%    get attribute of a file matched by FindFirstFx
  372.    GetDateF      get date of a file matched by FindFirstF
  373.    GetDateFx$    get date of a file matched by FindFirstFx
  374.    GetDrive$     get the default drive
  375.    GetExecPath   get drive, subdir, name of current program
  376.    GetLabel      get a disk volume label
  377.    GetLogiDrive  get logical drive (useful for 1-floppy setups)
  378.    GetNameF      get the name of a file matched by FindFirstF
  379.    GetNameFx$    get the name of a file matched by FindFirstFx
  380.    GetSerial     get a disk serial number
  381.    GetSizeFL     get the size of a file matched by FindFirstF
  382.    GetSizeFx&    get the size of a file matched by FindFirstFx
  383.    GetSub        get the default subdirectory
  384.    GetSub1       get the default subdirectory on a given drive
  385.    GetTimeF      get the time of a file matched by FindFirstF
  386.    GetTimeFx$    get the time of a file matched by FindFirstFx
  387.    GetVerify     determine status of the DOS "verify" setting
  388.    Heads%        get number of heads for a given drive
  389.    LoadDir       load names of matching files into an array
  390.    LoadDirAll    load all info about matching files into array
  391.    LogicalDrives% see how many logical drives are available
  392.    MakeSub       create a subdirectory
  393.    RenSub        rename a subdirectory
  394.    Retries       set the retries used for file networking
  395.    SDFlush       flush SMARTDRV disk caches
  396.    SDGetVer      get SMARTDRV driver version
  397.    SDRCached%    see whether a drive is read cached by SMARTDRV
  398.    SDReset       reset SMARTDRV disk caches
  399.    SDStats       get SMARTDRV cache hit and miss information
  400.    SDWCached%    see whether a drive is write cached by SMARTDRV
  401.    SetDrv        set the default drive
  402.    SetLabel      set a disk volume label
  403.    SetLogiDrive  set logical drive (useful for 1-floppy setups)
  404.    SetSub        set the default subdirectory
  405.    SetVerify     set the state of the DOS "verify" switch
  406.    SubExist      determine whether a subdirectory exists
  407.    SubExist2%    determine whether a subdirectory exists
  408.  
  409.                       Routine Reference
  410.  
  411.  
  412.  
  413. Display:
  414.    BigPrint      display text in huge letters
  415.    BkSpace       backspace destructively with wrap
  416.    BkScroll      scroll an area of the screen down
  417.    Blink         switch blinking vs. intense background colors
  418.    CalcAttr      calc color/attribute from fore & background
  419.    CalcAttr2%    calc color/attribute from fore & background
  420.    CalcSize      calc array size needed to save a screen area
  421.    CalcVGAColor  calculate a VGA palette color setting
  422.    ClearArea     clear an area of the screen w/ special effects
  423.    Clock         display a clock on the screen constantly
  424.    ClockSet      set various parameters for the clock
  425.    ClrCols       clear between specified columns on a row
  426.    ClrEOL        clear to the end of the row
  427.    ClrEOP        clear to the end of the screen
  428.    ClrSOL        clear to the start of the row
  429.    ClrSOP        clear to the start of the screen
  430.    CPrintScreen1 send a SCREEN 1 display to the printer
  431.    CPrintScreen2 send a SCREEN 2 display to the printer
  432.    CursorInfo    return cursor visibility, current & max sizes
  433.    CWindowManC   display pop-up window in CGA graphics mode
  434.    DClear        clear a display being kept in an array
  435.    DClearSS      clear a display of unusual size in an array
  436.    DelChr        delete a character from the screen
  437.    DelLine       delete a row from the screen
  438.    DGClear       clear a CGA virtual screen
  439.    DGetScreen    get an area of the screen into an array
  440.    DGQPrint      write to a CGA virtual screen (SCREEN 1 type)
  441.    DGXQPrint     write to a CGA virtual screen (SCREEN 2 type)
  442.    DGXQPrint1    write to a CGA virtual screen (SCREEN 2 type)
  443.    Dissolve      clear the screen with special effects
  444.    DMPrint       display text directly through DOS services
  445.    DOSClrEol     clear from the cursor to end of line via DOS
  446.    DOSCls        clears the screen using DOS output
  447.    DOSColor      sets the screen color using DOS output
  448.    DOSLocate     sets the cursor position using DOS output
  449.    DPutScreen    put an array onto an area of the screen
  450.    DRecolor      recolor text of a specified color in an array
  451.    DRecolorArea  recolor a block of text in an array
  452.    DScrRest      restore a saved screen from an array
  453.    DScrSave      save a screen to an array or other memory
  454.    DWindowMan    make a pop-up window in an array
  455.    DWindowMan2   pop-up window in an array (definable frames)
  456.    DWindowMan3   pop-up window in an array (array-based parms)
  457.    DWindowMan4   pop-up window in an array (spartan version)
  458.    DXQPrint      write text into an array
  459.    EGARest7      restore a saved screen to EGA SCREEN 7 display
  460.    EGARest8      restore a saved screen to EGA SCREEN 8 display
  461.    EGARest9      restore a saved screen to EGA SCREEN 9 display
  462.    EGASave7      save an EGA SCREEN 7 display to an array
  463.    EGASave8      save an EGA SCREEN 8 display to an array
  464.    EGASave9      save an EGA SCREEN 9 display to an array
  465.  
  466.                       Routine Reference
  467.  
  468.  
  469.  
  470. Display:
  471.    EWindowManC   display pop-up window on EGA/VGA graphics
  472.    EXQPrintC     display text at high speed on EGA/VGA graphics
  473.    FadeOut       clear the screen with special effects
  474.    GetColor      get the current colors being used by BASIC
  475.    GetCRT%       determine whether the display is color or mono
  476.    GetEGA        see if an EGA is in use and get info about it
  477.    GetEGA2%      see if an EGA is in use
  478.    GetHGA%       see if a Hercules mono adapter is in use
  479.    GetLine       get a row of text from virtual or saved screen
  480.    GetRows%      see how many rows are on the screen
  481.    GetScreen     get an area of the screen into an array
  482.    GetVGA        see if a VGA is in use
  483.    GetVGA2%      see if a VGA is in use
  484.    GetVGAColor   get the specified VGA palette setting
  485.    GetVGAPalette get the specified VGA palette settings
  486.    GetVidMode    get display mode and other screen info
  487.    GQPrint       display text quickly in CGA SCREEN 2 mode
  488.    GrafPrint     display sized text at graphics coordinates
  489.    GrafRest      restore a saved CGA graphics screen
  490.    GrafSave      save a CGA graphics screen to an array
  491.    GXQPrint      display text quickly in CGA SCREEN 1
  492.    GXQPrint1     display text quickly in CGA SCREEN 1
  493.    HCls          clear screen in Hercules graphics mode
  494.    HiLite        highlight text on the screen
  495.    HLine         draw a line in Hercules graphics mode
  496.    HMode         switch between text and Herc graphics modes
  497.    HPrint        display text in Hercules graphics mode
  498.    HSetPixel     plot a point in Hercules graphics mode
  499.    HTestPixel    get the color of a point in Herc graphics mode
  500.    InsChr        insert a space onto the screen
  501.    InsLine       insert a blank row onto the screen
  502.    LScroll       scroll an area of the screen left
  503.    MPrint        display text through DOS, obeying MWindow
  504.    MWindow       sets a display region for MPrint
  505.    PrintBox      display a box of characters or strings
  506.    PrintScreen   print the screen on a printer
  507.    PutScreen     put an array onto an area of the screen
  508.    QPrint        display text very quickly
  509.    ReadScreen    read a string from the screen
  510.    ReColor       change text of a selected color to a new color
  511.    ReColorArea   change text in a selected area to a new color
  512.    RScroll       scroll an area of the screen right
  513.    Scroll        scroll an area of the screen up
  514.    ScrRest       restore a saved screen from an array
  515.    ScrSave       save a screen to an array
  516.    SCrunch       compress an 80x25 text screen in an array
  517.    SCrunchSS     compress any size of text screen in an array
  518.    SetCGAColor   set various aspects of CGA colors
  519.    SetVGAColor   set the specified VGA palette info (1 color)
  520.    SetVGAPalette set the specified VGA palette info (1+ colors)
  521.    ShowBMP       display a Windows bitmap file (.BMP)
  522.    ShowIcon      display a Windows icon file (.ICO)
  523.    Split         clear the screen by scrolling different ways
  524.    TypePrint     display text as if it is being typed
  525.  
  526.                       Routine Reference
  527.  
  528.  
  529.  
  530. Display:
  531.    UnCalcAttr    convert color/attribute to fore & background
  532.    UnSCrunch     uncompress a "scrunched" screen (80x25 only)
  533.    UnSCrunchSS   uncompress a "scrunched" screen (any size)
  534.    UnSplit       restore saved screen by scroll. different ways
  535.    VerticalPrint display a string vertically
  536.    VGARest13     restore a saved screen in VGA SCREEN 13 mode
  537.    VGASave13     save a VGA SCREEN 13 display to an array
  538.    WindowMan     display a pop-up window
  539.    WindowMan2    display a pop-up window (user-defined frames)
  540.    WindowMan3    display a pop-up window (array-based parms)
  541.    WindowMan4    display a pop-up window (spartan version)
  542.    XMPrint       display text through DOS after translation
  543.    XQPrint       display text very quickly
  544.    XQPrintOver   quick text display, overlaying existing text
  545.  
  546. Equipment:
  547.    AllExtMem&    see how much extended memory was found at boot
  548.    BootDrive     determine the drive used to boot the computer
  549.    BootDrive2$   determine the drive used to boot the computer
  550.    CDROM         see if a CD-ROM is installed and get info
  551.    CPUSpeed%     get the CPU speed in MHz
  552.    Equipment     find out about basic equipment (ports, memory)
  553.    ExtMem        see how much extended memory is available
  554.    Floppies      see how many floppy drives are available
  555.    Floppies2%    see how many floppy drives are available
  556.    FloppyType    see what types of floppy drives are installed
  557.    Get4DOSv      get installed version of 4DOS, if any
  558.    GetCRT%       determine whether the display is color or mono
  559.    GetDOSv       get the DOS version
  560.    GetEGA        see if an EGA is in use and get info about it
  561.    GetEGA2%      see if an EGA is in use
  562.    GetExtM       see how much extended memory is available
  563.    GetHGA%       see if a Hercules mono adapter is in use
  564.    GetLIMm       see how much expanded memory is available
  565.    GetLIMv       get the EMS driver version
  566.    GetMouseVer   get mouse driver version and hardware info
  567.    GetVGA        see if a VGA is in use
  568.    GetVGA2%      see if a VGA is in use
  569.    GetXMSm       see how much XMS memory is available
  570.    GetXMSv       get the XMS driver version
  571.    KbdType       see if the keyboard is enhanced (101-key)
  572.    KbdType2%     see if the keyboard is enhanced (101-key)
  573.    LogicalDrives% see how many logical drives are available
  574.    MMCheck       see if a mouse is available and # of buttons
  575.    MMCheck2%     see if a mouse is available and # of buttons
  576.    NumProc       see what kind of numeric coprocessor is in use
  577.    NumProc2%     see what kind of numeric coprocessor is in use
  578.    PCDat$        get the date of the ROM BIOS
  579.    PCDate        get the date of the ROM BIOS
  580.    PCType        get the machine I.D. from the ROM BIOS
  581.    PCType2%      get the machine I.D. from the ROM BIOS
  582.    Processor     see what kind of CPU is in use
  583.    Processor2%   see what kind of CPU is in use
  584.    SDGetVer      get SMARTDRV driver version
  585.    WinCheck      see what version of Windows is running, if any
  586.  
  587.                       Routine Reference
  588.  
  589.  
  590.  
  591. File:
  592.    BRead         read a byte from a file into an integer
  593.    BWrite        write a byte to a file from an integer
  594.    CloseA        close an archive opened by FindFirstA
  595.    CopyFile      copy a single file
  596.    DelFile       delete a file
  597.    DFRead        read from a file into an array or other mem.
  598.    DFWrite       write to a file from an array or other memory
  599.    Exist         see if a file exists
  600.    Exist2%       see if a file exists
  601.    ExplainFAttr$ return a text explanation of a file attribute
  602.    ExtendFSpec   check, complete, and format a filespec
  603.    FClose1       close a file
  604.    FCreate       create a file and open it for access
  605.    FGetLoc       get the position of a file pointer
  606.    FGetLoc2&     get the position of a file pointer
  607.    FileCopy      copy one or more files
  608.    FileCount     count the number of matching files
  609.    FileCRC       calculate a 32-bit CRC for a file
  610.    FindFirstA    find the first file in an archive
  611.    FindNextA     find any other files in an archive
  612.    FindPatch     find where to patch an .EXE
  613.    FLock         lock any part of a file
  614.    FlushToDisk   flush a file to disk (force it to be updated)
  615.    FOpen1        open a file
  616.    ForceMatch$   force a filename to match a wildcard pattern
  617.    FReadLine     read a line of text from an ASCII file
  618.    FSetEnd       move to the end of a file
  619.    FSetLoc       move to a specific location in a file
  620.    FSetOfs       move backwards or forwards within a file
  621.    FSetRec       move to a specific record location in a file
  622.    FSetSize      set the size of a file
  623.    FSize         get the size of a file
  624.    FSize2&       get the size of a file
  625.    FUnlock       unlock any part of a file (use w/ FLock)
  626.    GetCRCA       get CRC-16 of a file matched by FindFirstA
  627.    GetCRCAL      get CRC-32 of a file matched by FindFirstA
  628.    GetDateA      get date of a file matched by FindFirstA
  629.    GetFAttr      get attribute of a file
  630.    GetFDate      get the date of a file
  631.    GetFSize&     get the size of a file
  632.    GetFTime      get the time of a file
  633.    GetNameA      get the name of a file matched by FindFirstA
  634.    GetSizeAL     get the size of a file matched by FindFirstA
  635.    GetStoreA     get storage type of file matched by FindFirstA
  636.    GetTimeA      get the time of a file matched by FindFirstA
  637.    GLoad         load a binary image from a file (like BLOAD)
  638.    IdentifyFile  try to identify a file
  639.    IRead         read an integer from a file
  640.    IWrite        write an integer to a file
  641.  
  642.                       Routine Reference
  643.  
  644.  
  645.  
  646. File:
  647.    LIRead        read an integer from a file into a long int
  648.    LIWrite       write an integer to a file from a long integer
  649.    LRead         read a long integer from a file
  650.    LWrite        write a long integer to a file
  651.    MatchFile     see if a filename matches a wildcard filespec
  652.    ObjScan       scan an .OBJ file, return publics & externals
  653.    ParseFSpec    split filespec into drive, subdir, filename
  654.    PatchDone     terminates patching of an .EXE file
  655.    RandFile$     return a random file name
  656.    Rename        rename a file
  657.    SetFAttr      set the attribute of a file
  658.    SetFTD        set the time and date of a file
  659.    SetPatch      installs a patch into an .EXE file
  660.    SFRead        read from a file into a string
  661.    SFWrite       write from a string into a file
  662.    ShowBMP       display a Windows bitmap file (.BMP)
  663.    ShowIcon      display a Windows icon file (.ICO)
  664.  
  665.                       Routine Reference
  666.  
  667.  
  668.  
  669. Input:
  670.    AltKey        returns letter from ASCII & scan codes of key
  671.    BarMenu       bar menu (single row) for keyboard only
  672.    BarMenuM      bar menu (single row) for keyboard or mouse
  673.    BIOSInkey     get a key from BIOS if any is waiting
  674.    BoxMenu       box menu (single column) for picking one item
  675.    BoxMenu1      box menu (single column) for picking items
  676.    BreakCheck    see if Break has been pressed
  677.    BreakOff      make sure Break doesn't interrupt the program
  678.    BreakOffDone  remove Break handler
  679.    CheckKey      get a key if any is waiting, or a mouse button
  680.    CheckKey3     get a key if any is waiting, or a mouse button
  681.    ClrKbd        clear the keyboard buffer
  682.    CtrlKey       returns letter, given ASCII code of Ctrl key
  683.    DInput        formatted dollar input routine
  684.    DOSInkey      get a key from DOS if any is waiting
  685.    DOSInky$      get a key from DOS if any is waiting
  686.    EnhKbd        enable/disable enhanced keyboard handling
  687.    FileMenu      menu for picking a file
  688.    GetKbd        get state of keyboard toggles (CapsLock, etc)
  689.    GetKbd1       get state of shift keys (Control, Alt, etc)
  690.    GetKbd2       get state of shift keys (Left/Right Alt, etc)
  691.    GetKey        get a key or mouse click (wait; 2-button)
  692.    GetKey3       get a key or mouse click (wait; 3-button)
  693.    GetPrtSc%     get whether Print Screen was pressed
  694.    GetValidKey   get one of a list of valid keys
  695.    JButtonA1%    get state of joystick A button 1
  696.    JButtonA2%    get state of joystick A button 2
  697.    JButtonB1%    get state of joystick B button 1
  698.    JButtonB2%    get state of joystick B button 2
  699.    JButtons      get state of all joystick buttons
  700.    JPos          get X,Y positions of joysticks
  701.    KbdType       see if the keyboard is enhanced (101-key)
  702.    KbdType2%     see if the keyboard is enhanced (101-key)
  703.    KeyPress      see if a key is waiting to be retrieved
  704.    PrtSc         disable the PrtSc/PrintScreen key
  705.    ScanKey       get a key, if any, w/o taking it from buffer
  706.    SetKbd        set state of keyboard toggles (CapsLock, etc)
  707.    SetMouseLoc   set the mouse cursor position (text mode)
  708.    SInput        flexible replacement for LINE INPUT
  709.    SInputSet     set SInput parms (fill, exitmode, beeps, fast)
  710.    SInputSet1    set SInput parms (cursor position, full exit)
  711.    SInputSet2    set SInput parms (capitalize, tab exit)
  712.    SpeedKey      change the keyboard repeat rate
  713.    TypeIn        stuff keys into buffer as if they were typed
  714.  
  715.                       Routine Reference
  716.  
  717.  
  718.  
  719. Memory:
  720.    BlockMove     copy data from one area of memory to another
  721.    DataSeg       determine the default data segment (dgroup)
  722.    DataSeg2%     determine the default data segment (dgroup)
  723.    EMSBuffer     get the bytes needed to save EMS array state
  724.    EMSClose      close an EMS array
  725.    EMSGet        get an element from an EMS array
  726.    EMSOpen       create an EMS array
  727.    EMSPut        put an element into an EMS array
  728.    EMSRest       restore the EMS array state
  729.    EMSSave       save the EMS array state
  730.    ExtGet        get data from extended memory
  731.    ExtMem        see how much extended memory is available
  732.    ExtPut        put data into extended memory
  733.    FarPeek%      get byte from memory (like PEEK w/o DEF SEG)
  734.    FarPeekI%     get word from memory (like two PEEKs)
  735.    FarPeekL&     get dword from memory (like four PEEKs)
  736.    FarPoke       put byte into memory (like POKE w/o DEF SEG)
  737.    FarPokeI      put word into memory (like two POKEs)
  738.    FarPokeL      put dword into memory (like four POKEs)
  739.    GetExtM       see how much extended memory is available
  740.    GetLIMHandles get the number of EMS handles being used
  741.    GetLIMm       see how much expanded memory is available
  742.    GetLIMv       get the EMS driver version
  743.    GetMemBox     get location and size of MEMBOX TSR memory
  744.    GetPSP%       get the segment of the Program Segment Prefix
  745.    GetXMSm       see how much XMS memory is available
  746.    GetXMSv       get the EMS driver version
  747.    LClose        close a block of expanded memory
  748.    LGet          get a block of data from expanded memory
  749.    LOpen         open a block of expanded memory
  750.    LPut          put a block of data into expanded memory
  751.    MemSwap       swap contents of one area of memory w/ another
  752.  
  753. Miscellaneous:
  754.    CreditCard$   see if a credit card number is maybe valid
  755.    Command2$     get the original DOS command line
  756.    DOSErrM$      convert a DOS error code into a text message
  757.    DOSInt%       execute a DOS function (like CALL INTERRUPT)
  758.    DupeVar       copy a TYPEd variable into a different TYPE
  759.    CatchError    set up to grab exit code from SHELLed program
  760.    GetError      get the exit code from a SHELLed program
  761.    GetError2%    get the exit code from a SHELLed program
  762.    GetSwitch$    get the DOS switch character
  763.    HandleInfo    see if a handle refers to a file or a device
  764.    IntVector     get the address of an interrupt handler
  765.    Reboot        boot the computer (like Control-Alt-Del)
  766.    RedirectIn    see whether input has been redirected
  767.    RedirectOut   see whether output has been redirected
  768.    SetError      set exit code to return when program ends
  769.    TVIdle        return clock ticks to TopView, DESQview, et al
  770.  
  771.                       Routine Reference
  772.  
  773.  
  774.  
  775. Mouse:
  776.    CheckKey      get a key if any is waiting, or a mouse button
  777.    CheckKey3     get a key if any is waiting, or a mouse button
  778.    GetKey        get key or mouse click (wait for it; 2-button)
  779.    GetKey3       get key or mouse click (wait for it; 3-button)
  780.    GetMouseLoc   get the mouse cursor position (text mode)
  781.    GetMouseVer   get mouse driver version and hardware info
  782.    LClickLoc     get mouse position at last left click
  783.    MClickLoc     get mouse position at last middle click
  784.    MMButton      see which mouse buttons are pressed (2-button)
  785.    MMButton3     see which mouse buttons are pressed (3-button)
  786.    MMCheck       see if a mouse is installed & no. of buttons
  787.    MMCheck2%     see if a mouse is installed & no. of buttons
  788.    MMClick       see which buttons have been pressed (2-button)
  789.    MMClick3      see which buttons have been pressed (3-button)
  790.    MMCursorOff   make the mouse cursor invisible
  791.    MMCursorOn    make the mouse cursor visible
  792.    MMGetLoc      get the mouse cursor position
  793.    MMSetLoc      set the mouse cursor position
  794.    MMSetRange    set the allowable range of the mouse cursor
  795.    MouseBuffer   get no. of bytes needed to save mouse state
  796.    MouseCursor   set the mouse graphics cursor type
  797.    MousePen      turn light pen emulation by the mouse on/off
  798.    MouseRest     restore a saved mouse state
  799.    MouseSave     save the current state of the mouse
  800.    RClickLoc     get mouse position at last right click
  801.    SetMouseLoc   set the mouse cursor position (text mode)
  802.  
  803.                       Routine Reference
  804.  
  805.  
  806.  
  807. Numeric:
  808.    Any2Dec       convert a number from any base into an integer
  809.    CeilD#        return the smallest integer >= number
  810.    CeilS!        return the smallest integer >= number
  811.    Dec2Any       convert an integer to any base
  812.    FloorD#       return the largest integer <= number
  813.    FloorS#       return the largest integer <= number
  814.    HiByte%       return the high byte of an integer
  815.    HiWord%       return the high word of a long integer
  816.    IVal%         convert a string to an integer
  817.    KVal%         convert a string to a long integer / 1024
  818.    LoByte%       return the low byte of an integer
  819.    LoWord%       return the low word of a long integer
  820.    LVal%         convert a string to a long integer
  821.    Max%          return the greater of two integers
  822.    MaxD#         return the greater of two double-prec. numbers
  823.    MaxL&         return the greater of two long integers
  824.    MaxS!         return the greater of two single-prec. numbers
  825.    Min%          return the smaller of two integers
  826.    MinD#         return the smaller of two double-prec. numbers
  827.    MinL&         return the smaller of two long integers
  828.    MinS!         return the smaller of two single-prec. numbers
  829.    Num2Phone$    convert a compressed phone number to a string
  830.    NumFormat     format a number as a string, like PRINT USING
  831.    Odd%          return whether an integer is odd
  832.    OddL%         return whether a long integer is odd
  833.    Phone2Num&    compress a phone number into a long integer
  834.    Rand%         return pseudo-random number in specified range
  835.    ReadBitF      read value of given bit length from an array
  836.    RndI%         return pseudo-random number in specified range
  837.    RotateL       rotate the bits in an integer left
  838.    RotateLL      rotate the bits in a long integer left
  839.    RotateR       rotate the bits in an integer right
  840.    RotateRL      rotate the bits in a long integer right
  841.    SetBit        set a specified bit in an integer
  842.    ShiftL        shift the bits in an integer left
  843.    ShiftLL       shift the bits in a long integer left
  844.    ShiftR        shift the bits in an integer right
  845.    ShiftRL       shift the bits in a long integer right
  846.    WriteBitF     write value of given bit length into an array
  847.  
  848. Printer:
  849.    CPrintScreen1 send a SCREEN 1 display to the printer
  850.    CPrintScreen2 send a SCREEN 2 display to the printer
  851.    GetPrtAddr    get the address of a printer port
  852.    PrinterReady% see if a printer is ready
  853.    PrinterInit   initialize a printer
  854.    PrintFile     send a file to the printer
  855.    PrintScreen   print the screen on the printer
  856.    PrtSc         disable the PrtSc/PrintScreen key
  857.    PrtSwap       swap any two printer ports
  858.    SetPrtAddr    set the address of a printer port
  859.    Spooler       see if DOS print spooler (PRINT.COM) is loaded
  860.  
  861.                       Routine Reference
  862.  
  863.  
  864.  
  865. Serial:
  866.    Carrier       determine if a carrier is present
  867.    CheckCAS%     determine if a CAS driver is present
  868.    Checksum      calculate an 8-bit checksum for a string
  869.    Checksum2%    calculate an 8-bit checksum for a string
  870.    CRC           calculate a 16-bit CRC for a string (obsolete)
  871.    CRC1          calculate a 16-bit CRC for a string
  872.    CRC32Calc     calculate a 32-bit CRC for a string
  873.    CRC32Done%    return a 32-bit CRC for a string
  874.    CRC32Init     initialize 32-bit CRC string calculations
  875.    DTR           set the state of the DTR line
  876.    GetCommAddr   get the address of a comm port
  877.    SetComm       set communications parameters
  878.    SetCommAddr   set the address of a comm port
  879.  
  880.  
  881.  
  882. SoundBlaster:
  883.    SBFreeHandles% get number of free SBSIM XMS handles
  884.    SBFreeXMS     release an SBSIM XMS handle
  885.    SBGetActive   get which devices are active
  886.    SBGetDrivers  get which devices are currently supported
  887.    SBGetVer      get SBSIM driver version number
  888.    SBGetVolume   get volume levels for a sound source
  889.    SBInitSrcFile initialize SBSIM to read from a sound file
  890.    SBInitSrcXMS  initialize SBSIM to load a .VOC into XMS
  891.    SBInt%        get SBSIM interrupt (0 if not installed)
  892.    SBIsFree%     get whether an SBSIM XMS handle is in use
  893.    SBLoadXMS     load a .VOC file into XMS memory
  894.    SBMapMIDI     set MIDI mapping
  895.    SBPause       pause the playing of a sound
  896.    SBPlay        play a sound
  897.    SBResume      resume playing a sound (used after SBPause)
  898.    SBSetVolume   set volume level of a sound source
  899.    SBStatus%     get status of a driver
  900.    SBStop        stop playing a sound
  901.  
  902.                       Routine Reference
  903.  
  904.  
  905.  
  906. String:
  907.    AndSt         AND the bytes in two strings together
  908.    AscI%         get the ASCII value of a character (like ASC)
  909.    AscM%         get the ASCII value of any char in a string
  910.    Bickel        compare two strings using Bickel's algorithm
  911.    Bickel2%      compare two strings using Bickel's algorithm
  912.    BSq           compress the blanks out of a text string
  913.    BUsq          restore a string that was compressed by BSq
  914.    BUsqLen       determine expanded length of a BSq'ed string
  915.    CenterSt$     center a string
  916.    Checksum      calculate an 8-bit checksum for a string
  917.    Checksum2%    calculate an 8-bit checksum for a string
  918.    Cipher        perform simple string encryption/decryption
  919.    CipherP       like Cipher, only the results are printable
  920.    CRC           calculate a 16-bit CRC for a string (obsolete)
  921.    CRC1          calculate a 16-bit CRC for a string
  922.    CRC32Calc     calculate a 32-bit CRC for a string
  923.    CRC32Done%    return a 32-bit CRC for a string
  924.    CRC32Init     initialize 32-bit CRC string calculations
  925.    Crunch        remove repeated values from a string
  926.    DGetRec       get a string from memory in a record format
  927.    DGetSt        get string from numeric array or other memory
  928.    DPutRec       put a string into memory in a record format
  929.    DPutSt        put string into numeric array or other memory
  930.    ExtendFSpec   check, complete, and format a filespec
  931.    Extract       extract a delimited substring from a string
  932.    ForceMatch$   force a filename to match a wildcard pattern
  933.    FormatPhone$  format a phone number
  934.    FromPostal$   convert a postal abbreviation to a state name
  935.    IsAlNum%      test whether a char. is alphabetic or numeric
  936.    IsAlpha%      test whether a character is alphabetic
  937.    IsASCII%      test whether a character is ASCII
  938.    IsCntrl%      test whether a character is a control code
  939.    IsDigit%      test whether a character is a digit
  940.    IsLower%      test whether a char. is lowercase alphabetic
  941.    IsPrint%      test whether a character is printable
  942.    IsPunct%      test whether a character is punctuation
  943.    IsSpace%      test whether a character is white space
  944.    IStr$         convert an integer to a string (like STR$)
  945.    IStrNB$       convert an integer to a string w/o blank
  946.    IsUpper%      test whether a char. is uppercase alphabetic
  947.    IsXDigit%     test whether a char. is a hexadecimal digit
  948.    Locase        convert a string to lowercase (U.S. only)
  949.    Locase1       convert a string to lowercase (international)
  950.    LRotate       rotate the characters in a string left once
  951.    MatchFile     see if filename matches a wildcard filespec
  952.    Month0        return the name of the month, given month no.
  953.    MultiAND      perform an arithmetic AND operation on string
  954.    MultiOR       perform an arithmetic OR operation on a string
  955.    MultiXOR      perform an arithmetic XOR operation on string
  956.  
  957.                       Routine Reference
  958.  
  959.  
  960.  
  961. String:
  962.    NameCase      capitalize a string correctly for a name
  963.    NameCase2$    capitalize a string correctly for a name
  964.    Num2Phone$    convert a compressed phone number to a string
  965.    OrSt          OR bytes in one string with those in another
  966.    Phone2Num&    compress a phone number into a long integer
  967.    Replace       replace one character with another
  968.    ReplaceSt     replace one substring with another
  969.    Reverse       reverse a string
  970.    RInstr        find last occurrence of substring w/in string
  971.    RolSt         rotate the bits in a string left
  972.    RorSt         rotate the bits in a string right
  973.    RRotate       rotate the characters in a string right once
  974.    SFRead        read a string from a file
  975.    SFWrite       write a string to a file
  976.    ShlSt         shift the bits in a string left
  977.    ShrSt         shift the bits in a string right
  978.    ShuffleSt     shuffle the characters in a string
  979.    Soundex       determine what a string "sounds" like
  980.    SSrch         see if one string is within another
  981.    StrDel        delete a character from a string
  982.    StrIns        insert a space into a string
  983.    Strip         strip the blanks from both sides of a string
  984.    Strip2$       strip the blanks from both sides of a string
  985.    StripBlanks   strip the blanks from side(s) of a string
  986.    StripChar     strip a specified list of chars from a string
  987.    StripRange    strip a specified range of chars from a string
  988.    StripSpaces   strip the spaces from side(s) of a string
  989.    StrSqu$       compress text string using 2&3-gram compress.
  990.    StrSqu2       compress text string using 2-gram compression
  991.    StrSqu3       compress text string using 3-gram compression
  992.    StrSquLen2    determine 2-gram compressed length of string
  993.    StrSquLen3    determine 3-gram compressed length of string
  994.    StrUnsq$      uncompress a 2 & 3-gram compressed string
  995.    StrUnsqu2     uncompress a 2-gram compressed string
  996.    StrUnsqu3     uncompress a 3-gram compressed string
  997.    StrUnsquLen2  calc full length of 2-gram compressed string
  998.    StrUnsquLen3  calc full length of 3-gram compressed string
  999.    TInstr        search for a specific kind of char in a string
  1000.    ToPostal$     convert state name to its postal abbreviation
  1001.    Upcase        convert a string to uppercase (U.S. only)
  1002.    Upcase1       convert a string to uppercase (international)
  1003.    UpcaseI       convert an ASCII code to uppercase (U.S. only)
  1004.    UpcaseI1      convert ASCII to uppercase (international)
  1005.    ValidSt%      see if a string contains only approved chars
  1006.    Xlate         run each char of a string through translation
  1007.    XorSt         XOR bytes in one string with those in another
  1008.  
  1009.                       Routine Reference
  1010.  
  1011.  
  1012.  
  1013. Time:
  1014.    CalcDate      get date a number of days from a starting date
  1015.    CheckDate     check a date to determine whether it is valid
  1016.    Clock         display a clock on the screen, constantly
  1017.    ClockSet      set the parameters for the clock
  1018.    Date2Int      squash a date into a single integer
  1019.    DateA2R       convert a date to a number you can calc with
  1020.    DateN2S       convert a date from numbers into a string
  1021.    DateR2A       convert a number to a date
  1022.    DateS2N       convert a date from string form into numbers
  1023.    DCal          draw a calendar into an array for ScrRest
  1024.    DCalendar     draw a calendar & let user to select date
  1025.    Delay         delay for a given number of seconds
  1026.    Delay18th     delay for a given number of 18ths of seconds
  1027.    DelayV        delay for a very small amount of time
  1028.    Elapsed       determine the elapsed time between two times
  1029.    ElapsedTime$  determine the elapsed time between two times
  1030.    EuropeDate    convert a date to European format
  1031.    FormatDate    convert a date to any desired format
  1032.    GetDateA      get the date of a file matched by FindFirstA
  1033.    GetDateAT     get the date from the AT hardware clock
  1034.    GetDateF      get date of a file matched with FindFirstF
  1035.    GetDateFx$    get date of a file matched with FindFirstFx
  1036.    GetFDate      get the date of a file
  1037.    GetFTime      get the time of a file
  1038.    GetTick&      get timer tick count (1/18th seconds)
  1039.    GetTime       get time from DOS, including 100th seconds
  1040.    GetTimeA      get the time of a file matched by FindFirstA
  1041.    GetTimeAT     get the time from the AT hardware clock
  1042.    GetTimeF      get time of a file matched with FindFirstF
  1043.    GetTimeFx$    get time of a file matched with FindFirstFx
  1044.    Int2Date      unsquash date from single integer to numbers
  1045.    Int2DateSt$   unsquash date from single integer to string
  1046.    Int2Time      unsquash time from single integer to numbers
  1047.    Int2TimeSt$   unsquash time from single integer to string
  1048.    Month0        return name of month, given the month number
  1049.    Sec2Time$     convert seconds past midnight to time string
  1050.    SetDateAT     set the date of the AT hardware clock
  1051.    SetTimeAT     set the time of the AT hardware clock
  1052.    Time2Int      squash a time into a single integer
  1053.    Time2Sec&     convert time string to seconds past midnight
  1054.    TimeN2S       convert a time from numbers into a string
  1055.    TimeS2N       convert a time from a string into numbers
  1056.    WeekDay0      get the day of the week
  1057.    WeekDay1      returns the day of the week for a given date
  1058.  
  1059.                       Enhanced Key Codes
  1060.  
  1061.  
  1062.  
  1063. This is a list of the new key codes available when you use
  1064. EnhKbd to enable enhanced keyboard support.  Note that the
  1065. codes are direct from the BIOS, and may not always match what
  1066. INKEY$ returns.  QuickBasic 4.5 provides only minimal support
  1067. for the enhanced keys; QBX does much better.  As long as you
  1068. use PBClone for input, of course, you don't have to worry about
  1069. it.
  1070.  
  1071. The format used is ScanCode, ASCIIcode.
  1072.  
  1073.  
  1074. Middle keypad key (num lock off):   0,76
  1075. Middle key, with Control:           0,143
  1076.  
  1077.              plain     shift     control     alt
  1078.              -----     -----     -------    -----
  1079.    F11       0,133     0,135      0,137     0,139
  1080.    F12       0,134     0,136      0,138     0,140
  1081.  
  1082. The middle cursor pad returns the same scan codes as the
  1083. cursor/numeric pad when NumLock is off, but with an ASCII code
  1084. of 224 instead of 0.  If you want the middle cursor pad and
  1085. cursor/numeric pad to return the same values, you should have
  1086. your code do this:
  1087.  
  1088.    ' ...get key code...
  1089.    IF ASCIIcode = 224 AND ScanCode <> 0 THEN ASCIIcode = 0
  1090.  
  1091. Why test both ASCII and scan codes?  Because it is possible for
  1092. the user to enter a plain 224 by holding ALT and using the
  1093. numeric keypad, which could cause confusion.
  1094.  
  1095. The arrows in the middle cursor pad will return special codes
  1096. if pressed in combination with an ALT key:
  1097.  
  1098.    up    arrow     0,152
  1099.    down  arrow     0,160
  1100.    left  arrow     0,155
  1101.    right arrow     0,157
  1102.  
  1103. Finally, the arrow keys on either cursor pad will return
  1104. special codes if pressed in combination with a CONTROL key:
  1105.  
  1106.                    middle pad     cursor/num pad
  1107.                    ----------     --------------
  1108.    up    arrow       224,141          0,141
  1109.    down  arrow       224,145          0,145
  1110.    left  arrow       224,115          0,115
  1111.    right arrow       224,116          0,116
  1112.  
  1113.                         DOS Error Codes
  1114.  
  1115.  
  1116.  
  1117. Note that the number of error codes available depends on the
  1118. version of DOS in use.  Older versions return fewer error
  1119. codes, meaning that the nature of the error may not be
  1120. specified as precisely as you might like.  This is not a
  1121. complete list of all possible codes, but it covers the most
  1122. common ones.
  1123.  
  1124. The DOSErrM$ function can be used to generate a complete error
  1125. list if needed, current at least through DOS 3.31.  If later
  1126. versions of DOS have new error codes, I'm not aware of 'em.
  1127.  
  1128.  
  1129.   -1    Unable to read or write all of the data requested
  1130.    0    No error
  1131.    1    Invalid function number
  1132.    2    File not found
  1133.    3    Path not found
  1134.    4    No handle available (too many files open)
  1135.    5    Access denied (file already in use or "read only")
  1136.    6    Invalid handle
  1137.   15    Invalid disk drive
  1138.   16    Attempt to remove current directory
  1139.   18    No more matching files
  1140.   19    Disk is write-protected
  1141.   20    Unknown unit
  1142.   21    Drive not ready
  1143.   22    Invalid command
  1144.   23    Data CRC error
  1145.   25    Seek error
  1146.   26    Disk is not in DOS format
  1147.   27    Sector not found
  1148.   28    Printer is out of paper
  1149.   29    Write fault
  1150.   30    Read fault
  1151.   31    General failure
  1152.   32    Sharing violation
  1153.   33    Lock violation
  1154.   34    Invalid disk change
  1155.   35    No FCB available
  1156.   36    No room in file sharing buffer
  1157.   80    File already exists
  1158.   82    Unable to create subdirectory
  1159.  
  1160.